home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / pascal / oop55.zip / CARDS.PAS < prev    next >
Pascal/Delphi Source File  |  1989-05-02  |  2KB  |  136 lines

  1.  
  2. { Turbo Cards }
  3. { Copyright (c) 1989 by Borland International, Inc. }
  4.  
  5. unit Cards;
  6. { Turbo Pascal 5.5 object-oriented example.
  7.   This unit defines a Rolodex-like database of cards.
  8.   Refer to OOPDEMOS.DOC for an overview of this unit.
  9. }
  10.  
  11. {$S-}
  12.  
  13. interface
  14.  
  15. uses Objects;
  16.  
  17. type
  18.  
  19.   CardNodePtr = ^CardNode;
  20.   CardNode = record
  21.     Next: CardNodePtr;
  22.     Prev: CardNodePtr;
  23.     Data: record end;
  24.   end;
  25.  
  26.   CardListPtr = ^CardList;
  27.   CardList = object(Base)
  28.     Current: CardNodePtr;
  29.     Count, DataSize: Integer;
  30.     constructor Init(PDataSize: Integer);
  31.     constructor Load(var S: Stream);
  32.     destructor Done; virtual;
  33.     function CardData: Pointer;
  34.     procedure Delete;
  35.     procedure Insert;
  36.     procedure Next;
  37.     procedure Prev;
  38.     procedure Store(var S: Stream);
  39.   end;
  40.  
  41. implementation
  42.  
  43. constructor CardList.Init(PDataSize: Integer);
  44. begin
  45.   Current := nil;
  46.   Count := 0;
  47.   DataSize := PDataSize;
  48. end;
  49.  
  50. constructor CardList.Load(var S: Stream);
  51. var
  52.   I, N: Integer;
  53. begin
  54.   Current := nil;
  55.   Count := 0;
  56.   S.Read(N, SizeOf(Integer));
  57.   S.Read(DataSize, SizeOf(Integer));
  58.   for I := 1 to N do
  59.   begin
  60.     Insert;
  61.     S.Read(Current^.Data, DataSize);
  62.   end;
  63.   Next;
  64. end;
  65.  
  66. destructor CardList.Done;
  67. var
  68.   I: Integer;
  69. begin
  70.   for I := 1 to Count do Delete;
  71. end;
  72.  
  73. function CardList.CardData: Pointer;
  74. begin
  75.   CardData := @Current^.Data;
  76. end;
  77.  
  78. procedure CardList.Delete;
  79. var
  80.   N: CardNodePtr;
  81. begin
  82.   Dec(Count);
  83.   N := Current;
  84.   if Count = 0 then Current := nil else
  85.   begin
  86.     Current := N^.Prev;
  87.     Current^.Next := N^.Next;
  88.     N^.Next^.Prev := Current;
  89.   end;
  90.   FreeMem(N, DataSize + SizeOf(CardNode));
  91. end;
  92.  
  93. procedure CardList.Insert;
  94. var
  95.   N: CardNodePtr;
  96. begin
  97.   GetMem(N, DataSize + SizeOf(CardNode));
  98.   if Count = 0 then
  99.   begin
  100.     N^.Next := N;
  101.     N^.Prev := N;
  102.   end else
  103.   begin
  104.     N^.Next := Current^.Next;
  105.     Current^.Next^.Prev := N;
  106.     N^.Prev := Current;
  107.     Current^.Next := N;
  108.   end;
  109.   Current := N;
  110.   Inc(Count);
  111. end;
  112.  
  113. procedure CardList.Next;
  114. begin
  115.   if Current <> nil then Current := Current^.Next;
  116. end;
  117.  
  118. procedure CardList.Prev;
  119. begin
  120.   if Current <> nil then Current := Current^.Prev;
  121. end;
  122.  
  123. procedure CardList.Store(var S: Stream);
  124. var
  125.   I: Integer;
  126. begin
  127.   S.Write(Count, SizeOf(Integer) * 2);
  128.   for I := 1 to Count do
  129.   begin
  130.     S.Write(Current^.Data, DataSize);
  131.     Next;
  132.   end;
  133. end;
  134.  
  135. end.
  136.